/**
 *
 * <p>Sorting Network.</p>
 *
 * <p>Given sequence $a$, a <strong>comparator</strong> {@code [i:j]} compare and exchange $a_i$ and $a_j$ such that $a_i ≤ a_j$.</p>
 * <p>Below is the example of comparator {@code [0:1], [1:3], [2:0], [2:1]}.</p>
 * <pre>
 * ───╮───────╷───────
 * ───╵───╮───│───╷───
 * ───────│───╯───╯───
 * ───────╵───────────
 * </pre>
 *
 * <p>A <strong>comparator stage</strong> is a composition of comparators such that all end points are distinct. Comparators in a comparator stage can be executed in parallel.</p>
 * <pre>
 * ───╮────
 * ───│╮───
 * ───╵│───
 * ────╵───
 * ───╮────
 * ───│╮───
 * ───╵│───
 * ────╵───
 * </pre>
 *
 * <p>A <strong>comparator network</strong> is a composition of comparator stages</p>
 * <pre>
 * ───╮────╮───
 * ───│╮───╵───
 * ───╵│───╮───
 * ────╵───╵───
 * ───╮────╷───
 * ───│╮───╯───
 * ───╵│───╷───
 * ────╵───╯───
 * </pre>
 *
 * <p>A <strong>sorting network</strong> $N$ is a comparator network that sorts all input sequences size $N$. The sorting network does not depends on the input $A$, it only depends on structure $N$. With sorting network, the sequence of comparators are defined in advance. For example, this sorting network will sort any sequence of 4 values:</p>
 * <pre>
 * ───╮───────╮───────
 * ───│───╮───╵───╮───
 * ───╵───│───╮───╵───
 * ───────╵───╵───────
 * </pre>
 *
 * <p><strong>Theorem: 1-0 principle</strong>: A comparator network that can sort all $2^n$ sequences of 0s and 1s is a sorting network (i.e. it can sort all $n!$ sequences of arbitrary values).</p>
 *
 * <p>These are some sorting networks of size 8:</p>
 *
 * <p>Sequential Bubble sort</p>
 * <pre>
 * ──╮──────╮─────╮────╮───╮──╮──╮──
 * ──╵╮─────╵╮────╵╮───╵╮──╵╮─╵╮─╵──
 * ───╵╮─────╵╮────╵╮───╵╮──╵╮─╵────
 * ────╵╮─────╵╮────╵╮───╵╮──╵──────
 * ─────╵╮─────╵╮────╵╮───╵─────────
 * ──────╵╮─────╵╮────╵─────────────
 * ───────╵╮─────╵──────────────────
 * ────────╵────────────────────────
 * </pre>
 *
 * <p>Sequential Insert sort.</p>
 * <pre>
 * ──╮──╮──╮───╮────╮─────╮──────╮──
 * ──╵─╮╵─╮╵──╮╵───╮╵────╮╵─────╮╵──
 * ────╵─╮╵──╮╵───╮╵────╮╵─────╮╵───
 * ──────╵──╮╵───╮╵────╮╵─────╮╵────
 * ─────────╵───╮╵────╮╵─────╮╵─────
 * ─────────────╵────╮╵─────╮╵──────
 * ──────────────────╵─────╮╵───────
 * ────────────────────────╵────────
 * </pre>
 *
 * <p>Bubble or Insert sort in parallel.</p>
 * <pre>
 * ──╮─────╮─────╮─────╮─────╮─────╮─────╮───
 * ──╵──╮──╵──╮──╵──╮──╵──╮──╵──╮──╵──╮──╵───
 * ─────╵──╮──╵──╮──╵──╮──╵──╮──╵──╮──╵──────
 * ────────╵──╮──╵──╮──╵──╮──╵──╮──╵─────────
 * ───────────╵──╮──╵──╮──╵──╮──╵────────────
 * ──────────────╵──╮──╵──╮──╵───────────────
 * ─────────────────╵──╮──╵──────────────────
 * ────────────────────╵─────────────────────
 * </pre>
 * 
 * <p>Odd-even transposition sort.</p>
 * <pre>
 * ──╮─────╮─────╮─────╮──────
 * ──╵──╮──╵──╮──╵──╮──╵──╮───
 * ──╮──╵──╮──╵──╮──╵──╮──╵───
 * ──╵──╮──╵──╮──╵──╮──╵──╮───
 * ──╮──╵──╮──╵──╮──╵──╮──╵───
 * ──╵──╮──╵──╮──╵──╮──╵──╮───
 * ──╮──╵──╮──╵──╮──╵──╮──╵───
 * ──╵─────╵─────╵─────╵──────
 * </pre>
 *
 * <p>Odd even merge sort.</p>
 * <pre>
 * ──╮───╮────────╮─────────────────
 * ──╵───│╮───╮───│╮──────────╮─────
 * ──╮───╵│───╵───││╮────╮────╵─────
 * ──╵────╵───────│││╮───│╮───╮─────
 * ──╮───╮────────╵│││───╵│───╵─────
 * ──╵───│╮───╮────╵││────╵───╮─────
 * ──╮───╵│───╵─────╵│────────╵─────
 * ──╵────╵──────────╵──────────────
 * </pre>
 *
 *
 * Bitonic sort
 * <pre>
 * ──╮───╮────╮───╮──────╮────╮───   
 * ──╵───│╮───╵───│╮─────│╮───╵───   
 * ──╷───╵│───╮───││╮────╵│───╮───   
 * ──╯────╵───╵───│││╮────╵───╵───   
 * ──╮────╷───╷───╵│││───╮────╮───   
 * ──╵───╷│───╯────╵││───│╮───╵───   
 * ──╷───│╯───╷─────╵│───╵│───╮───  
 * ──╯───╯────╯──────╵────╵───╵───   
 * </pre>
 *
 * @author Trung
 * @see <a href="http://www.inf.fh-flensburg.de/lang/algorithmen/sortieren/algoen.htm">Sorting algorithms</a>
 */
package net.tp.algo.sort.network;
